package pe.com.bbva.carga.action;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

import com.ibm.ws.management.application.client.util;

import pe.com.bbva.carga.bo.ArchivoBO;
import pe.com.bbva.carga.bo.CargaManualBO;
import pe.com.bbva.carga.bo.LogProcesoBO;
import pe.com.bbva.carga.bo.ProcesoCargaBO;
import pe.com.bbva.carga.domain.Archivo;
import pe.com.bbva.carga.domain.CargaManual;
import pe.com.bbva.carga.domain.LogProceso;
import pe.com.bbva.carga.domain.Monitoreo;
import pe.com.bbva.carga.domain.ProcesoCarga;
import pe.com.bbva.configuracion.bo.ConfArchivoBO;
import pe.com.bbva.configuracion.bo.TurnoBO;
import pe.com.bbva.configuracion.domain.ConfArchivo;
import pe.com.bbva.configuracion.domain.Turno;
import pe.com.bbva.mantenimiento.bo.TablaBO;
import pe.com.bbva.mantenimiento.domain.Tabla;
import pe.com.bbva.util.Constantes;
import pe.com.bbva.util.Util;
import pe.com.stefanini.core.action.GenericAction;
import pe.com.stefanini.core.exceptions.BOException;
import pe.com.stefanini.core.exceptions.DAOException;
import pe.com.stefanini.core.util.StringUtil;

@Service("cargaMonitoreoAction")
@Scope("prototype")
@Results({
	@Result(name="viewListCargaMonitoreo",type="tiles", location="viewListCargaMonitoreo"),
	@Result(name="listaMonitoreo",type="json",params={"root","grid"}),
	@Result(name="listaConfArchivo",type="json"),
	@Result(name="listaLogArchivo",type="json",params={"root","grid"})
})
public class MonitoreoAction extends GenericAction {
	private static final long serialVersionUID = 1L;

	private Logger logger = Logger.getLogger(this.getClass());

	@Resource
	private TablaBO tablaBO;
	
	@Resource
	private TurnoBO turnoBO;
	
	@Resource
	private ConfArchivoBO confArchivoBO;
	
	@Resource
	private CargaManualBO cargaManualBO;
	
	@Resource
	private ProcesoCargaBO procesoCargaBO;
	
	@Resource
	private ArchivoBO archivoBO;
	
	@Resource
	private LogProcesoBO logProcesoBO;

	private String fechaProceso;
	private String idTurno;
	private String idTipoArchivo;
	
	private String idTurn;
	private String idConf;
	private String fecBus;
	
	private Long idProceso;
	private String nomArchivo;

	private List<Turno> listaTurno;
	private List<CargaManual> listaConfArchivo;
	private List<Monitoreo> listaProcesos;
	
	public void cleanForm() {
		setIdTurno(null);
		setIdTipoArchivo(null);
		setFechaProceso(null);
	}
	
	@Action(value="initMonitorArchivos")
	public String init() {
		Date date = new Date();
		setFechaProceso(Util.getFormatoFecha(date));
		return "viewListCargaMonitoreo";
	}
	
	@Action(value="findAllConfigurationMonitoreo")
	public String findAllConfiguration() {
		try {
			Turno turno = new Turno();
			turno.setId(Long.valueOf(idTurno));
			ConfArchivo archivoBuscar = new ConfArchivo();
			archivoBuscar.setTurno(turno);
			List<ConfArchivo> archivosConfigurados = confArchivoBO.findConfArchivo(archivoBuscar);
			List<CargaManual> listaTmp = new ArrayList<CargaManual>();
			for(ConfArchivo archivoConfigurado:archivosConfigurados){
				if(archivoConfigurado.getEstado().equals(Constantes.ESTADO_ACTIVO)){
					CargaManual cargaManual = new CargaManual();
					cargaManual.setIdTurno(turno.getId());
					cargaManual.setIdEquipo(archivoConfigurado.getEquipo().getId());
					cargaManual.setNombreEquipo(archivoConfigurado.getEquipo().getDescripcion());
					listaTmp.add(cargaManual);
				}
			}
			setListaConfArchivo(listaTmp);
			setIdTurno(idTurno);
			setListaTurno(turnoBO.findTurnos(new Turno()));
		} catch (BOException e) {
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			logger.error(StringUtil.getStackTrace(e));
		}
		return "listaConfArchivo";
	}
	
	@Action(value="showAllProcess")
	public String showAllProcess() {
		try {
			if(idTurno==null || idTurno.equals("")){
				if(!idTurn.equals(""))
					idTurno = idTurn;
			}
			if(idTipoArchivo==null || idTipoArchivo.equals("")){
				if(!idConf.equals(""))
					idTipoArchivo = idConf;
			}
			if(fechaProceso == null || fechaProceso.equals("")){
				if(!fecBus.equals(""))
					fechaProceso = fecBus;
			}
			if(idTurno!=null && !idTurno.equals("")){
				List<Monitoreo> procesoTmp = new ArrayList<Monitoreo>();
				Turno turnoBuscar = new Turno();
				if(!idTurno.equals("0"))
					turnoBuscar.setId(Long.valueOf(idTurno));
				List<Turno> turnos = turnoBO.findTurnos(turnoBuscar);
				for(Turno turno:turnos){
					ConfArchivo archivoBusc = new ConfArchivo();
					archivoBusc.setTurno(turno);
					if(!idTipoArchivo.equals("0")){
						archivoBusc.setEquipo(tablaBO.findById(Long.valueOf(idTipoArchivo)));
					}
					List<ConfArchivo> archivosConfigurados = confArchivoBO.findConfArchivo(archivoBusc);
					for(ConfArchivo archivoConfigurado:archivosConfigurados){
						if(archivoConfigurado.getEstado().equals(Constantes.ESTADO_ACTIVO)){
							ProcesoCarga proceso = new ProcesoCarga();
							SimpleDateFormat formatDay = new SimpleDateFormat("dd/MM/yyyy");
							Date fecha = formatDay.parse(fechaProceso);
							proceso.setFechaProceso(fecha);
							proceso.setTurno(turno);
							proceso.setEquipo(archivoConfigurado.getEquipo());
							List<ProcesoCarga> procesos = procesoCargaBO.findProcesosCarga(proceso);
							if(procesos!=null && !procesos.isEmpty()){
								proceso = procesos.get(0);
								Archivo archivoBuscar = new Archivo();
								archivoBuscar.setIdProceso(proceso.getId());
								List<Archivo> archivos = archivoBO.findArchivos(archivoBuscar);
								for(Archivo archivo: archivos){
									Monitoreo monitoreo = new Monitoreo();
									monitoreo.setCodigo(String.valueOf(proceso.getId()));
									monitoreo.setFecha(Util.getFormatoFecha(archivo.getFechaCargaFinal()));
								    monitoreo.setHora(Util.getFormatoHora(archivo.getFechaCargaFinal()));									 
									monitoreo.setDescripcion(archivo.getComentario());
									monitoreo.setArchivo(archivo.getNombreArchivo());
									if(archivo.getFormaCarga().equals(Constantes.ID_TIPO_CARGA_AUTOMATICO.toString())){
										monitoreo.setTipoCarga(Constantes.DES_CARGA_AUTOMATICO);
									}else if(archivo.getFormaCarga().equals(Constantes.ID_TIPO_CARGA_MANUAL.toString())){
										monitoreo.setTipoCarga(Constantes.DES_CARGA_MANUAL);
									}
									if(archivo.getEstadoCarga()!=null){
										Tabla estadoTabla = tablaBO.findById(Long.valueOf(archivo.getEstadoCarga()));
										monitoreo.setEstado(estadoTabla.getDescripcion());
										if(archivo.getEstadoCarga().equals(String.valueOf(Constantes.ESTADO_CARGA_FALLIDO))){
											List<LogProceso> logTmp = logProcesoBO.findLogProcesoByProceso(proceso.getId(), archivo.getNombreArchivo());
											if(logTmp!=null && !logTmp.isEmpty()){
												monitoreo.setLogProceso("1");
											}
										}
										procesoTmp.add(monitoreo);
									}
								}
							}
						}
					}
				}
				setListaProcesos(procesoTmp);
			}
			setGrid(cargaManualBO.findToGridMonitoreo(listaProcesos,getSidx()+" "+getSord(),getPage(),getRows()));
			if(getGrid().getRecords().equals(new Integer(0))){
				addActionError("No se encontraron resultados");
			}
		} catch (BOException e) {
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			logger.error(StringUtil.getStackTrace(e));
		}
		return "listaMonitoreo";
	}

	@Action(value="showLogProcess")
	public String showLogProcess() {
		try {
			setGrid(logProcesoBO.findToGridToLogProceso(idProceso, nomArchivo, getSidx()+" "+getSord(),getPage(),getRows()));
			if(getGrid().getRecords().equals(new Integer(0))){
				addActionError("No se encontraron resultados");
			}
		} catch (BOException e) {
			logger.error(StringUtil.getStackTrace(e));
		} catch (Exception e) {
			logger.error(StringUtil.getStackTrace(e));
		}
		return "listaLogArchivo";
	}
	
	public String getFechaProceso() {
		return fechaProceso;
	}

	public void setFechaProceso(String fechaProceso) {
		this.fechaProceso = fechaProceso;
	}

	public String getIdTurno() {
		return idTurno;
	}

	public void setIdTurno(String idTurno) {
		this.idTurno = idTurno;
	}

	public String getIdTipoArchivo() {
		return idTipoArchivo;
	}

	public void setIdTipoArchivo(String idTipoArchivo) {
		this.idTipoArchivo = idTipoArchivo;
	}

	public List<Turno> getListaTurno() throws BOException, DAOException {
		Turno turnoBuscar = new Turno();
		turnoBuscar.setEstado("1");
		listaTurno = turnoBO.findTurnos(turnoBuscar);
		if(listaTurno==null){
			listaTurno = new ArrayList<Turno>();
		}
		setListaConfArchivo(new ArrayList<CargaManual>());
		return listaTurno;
	}

	public void setListaTurno(List<Turno> listaTurno) {
		this.listaTurno = listaTurno;
	}

	public void setListaConfArchivo(List<CargaManual> listaConfArchivo) {
		this.listaConfArchivo = listaConfArchivo;
	}

	public List<CargaManual> getListaConfArchivo() {
		return listaConfArchivo;
	}

	public void setListaProcesos(List<Monitoreo> listaProcesos) {
		this.listaProcesos = listaProcesos;
	}

	public List<Monitoreo> getListaProcesos() {
		return listaProcesos;
	}

	public String getIdTurn() {
		return idTurn;
	}

	public void setIdTurn(String idTurn) {
		idTurn = idTurn.replaceAll("[,]?[\\s]+", "");
		this.idTurn = idTurn;
	}

	public String getIdConf() {
		return idConf;
	}

	public void setIdConf(String idConf) {
		idConf = idConf.replaceAll("[,]?[\\s]+", "");
		this.idConf = idConf;
	}

	public String getFecBus() {
		return fecBus;
	}

	public void setFecBus(String fecBus) {
		fecBus = fecBus.replaceAll("[,]?[\\s]+", "");
		this.fecBus = fecBus;
	}
	
	public Long getIdProceso() {
		return idProceso;
	}

	public void setIdProceso(Long idProceso) {
		this.idProceso = idProceso;
	}

	public String getNomArchivo() {
		return nomArchivo;
	}

	public void setNomArchivo(String nomArchivo) {
		this.nomArchivo = nomArchivo;
	}
}